package com.eddie.libray.utils;

import com.eddie.libray.LibraryDataSource;
import com.eddie.libray.entity.BookEntity;

import java.text.SimpleDateFormat;
import java.util.List;

/**
 * 数据源工具类
 *
 * @author Eddie
 * @since 2022/09/02 10:03
 **/
public class DataSourceUtils {


    /**
     * 根据书本编号查找书本在数据源中的下标
     *
     * @param id 书本编号
     * @return 下标
     */
    public static int getBookIndexById(int id) {
        return binarySearch(LibraryDataSource.books, id);
    }

    /**
     * 二分查找
     *
     * @param books   书籍数据源
     * @param findVal 查找的id
     * @return 返回查找的id在数据源中的下标
     */
    private static int binarySearch(List<BookEntity> books, int findVal) {
        int left = 0;
        int right = books.size() - 1;
        //中间值
        int mid;
        //当前元素id
        Integer thisId;
        while (left <= right) {
            mid = (left + right) / 2;
            thisId = books.get(mid).getId();
            if (thisId == findVal) {
                return mid;
                //如果当前找到的元素id小于目标元素id
            } else if (thisId < findVal) {
                //将坐指针移到中间下标+1的位置
                left = mid + 1;
            } else {
                //将右指针指向中间下标-1的位置
                right = mid - 1;
            }
        }
        return -1;
    }

    /**
     * 找到维护的书籍数据源中最后一本数
     * 暂时用于做id自增
     *
     * @return 最新一本书
     */
    public static BookEntity peek() {
        return LibraryDataSource.books.get(LibraryDataSource.books.size() - 1);
    }

    /**
     * 显示所有书籍
     */
    public static void list() {
        System.out.println("编号\t书名\t\t价格\t\t作者\t\t出版时间\t\t状态");
        //增强for的lambda表达式（java8新增语法）进行遍历
        LibraryDataSource.books.forEach(item -> {
            System.out.println(item.getId() + "\t"
                    + item.getName() + "\t"
                    + item.getPrice() + "\t"
                    + item.getAuthor() + "\t"
                    //使用simpleDateFormat来格式化出版日期
                    + new SimpleDateFormat("yyyy-MM-dd").format(item.getCreateTime()) + "\t"
                    //这里使用三元运算符来判断状态，对前台进行回显
                    + (item.getStatus() == 0 ? "未借出" : "已借出"));
        });
    }
}
